package com.gome.han.bigdata.spark.core.rdd.operation.transformation

import org.apache.spark.{SparkConf, SparkContext}

/**
 * @author Hanpeng
 * @date 2021/1/13 20:38
 * @description:
 */
object SampleOperation {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)

    // TODO 算子 - sample
    val rdd = sc.makeRDD(List(1,2,3,4,5,6,7,8,9,10))

    // sample算子需要传递三个参数
    // 1. 第一个参数表示，抽取数据后是否将数据返回 true（放回），false（丢弃）
    // 2. 第二个参数表示，
    //         如果抽取不放回的场合：数据源中每条数据被抽取的概率，基准值的概念
    //         如果抽取放回的场合：表示数据源中的每条数据被抽取的可能次数
    // 3. 第三个参数表示，抽取数据时随机算法的种子
    //                    如果不传递第三个参数，那么使用的是当前系统时间
            println(rdd.sample(
                false,
                0.4,
              1
            ).collect().mkString(","))
    /* 韩式解析
       1,withReplacement can elements be sampled multiple times (replaced when sampled out)
         反正也听不明白 True表示进行替换采样，False表示进行非替换采样。
       2,fraction(一部分)
          fraction expected size of the sample as a fraction of this RDD's size
          fraction指的是期望的样本的大小,是RDD size的一部分
   *  without replacement: probability that each element is chosen; fraction must be [0, 1]
      false(不放回)  表示每个元素被选中的概率,必须在[0,1]之间
   *  with replacement: expected number of times each element is chosen; fraction must be greater
      放回  期待的每个元素被选的次数。必须大于或者等于0
   *  than or equal to 0
      3,seed  seed for the random number generator生成随机数的种子
        如果为1 那就是以1 为起始值
        如果为2 以1 或者2 为起始值
        如果为3,以1或者2或者3为起始值
     */
 /*   println(rdd.sample(
      true,
      2,
      1
    ).collect().mkString(","))*/


    sc.stop()
  }
}
